package czolgisci;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * Klasa zarządzająca życiami graczy.
 * 
 * @author kasztan
 * @version 1.0
 */
public class Players
{
	private HashMap<String, Integer> players;
	private ArrayList<String> playersId;

	public final int DEFAULT_LIFES_NUM = 6;

	public Players()
	{
		players = new HashMap<String, Integer>();
		playersId = new ArrayList<String>();
	}

	/**
	 * Dodaje gracza
	 * 
	 * @param player
	 *            Name imię dodawanego gracza
	 * @param lifes
	 *            początkowa ilość żyć
	 */
	public void add(String playerName, int lifes)
			throws IllegalArgumentException
	{
		if (lifes <= 0)
			throw new IllegalArgumentException(
					"too small number of lifes (must be greater than zero)");

		players.put(playerName, lifes);
		playersId.add(playerName);
	}

	/**
	 * Dodaje gracza i nadaje mu domyślną ilość żyć
	 * 
	 * @param playerName imię dodawanego gracza
	 */
	public void add(String playerName)
	{
		players.put(playerName, DEFAULT_LIFES_NUM);
		playersId.add(playerName);
	}

	/**
	 * Odbiera jedno życie graczowi
	 * 
	 * @param playerName
	 *            imię gracza, któremu należy odebrać życie
	 * @return aktualna ilość żyć gracza
	 * @throws BadArgumentsException
	 */
	public int removeLife(String playerName) throws IllegalArgumentException
	{
		if (!players.containsKey(playerName))
			throw new IllegalArgumentException("Player does not exists!");

		int lifes = players.get(playerName) - 1;
		players.put(playerName, lifes);
		return lifes;
	}

	/**
	 * @param playerName
	 *            imię gracza, którego chcemy pobrać ilość żyć
	 * @return aktualna ilość żyć gracza
	 * @throws BadArgumentsException
	 */
	public int getLifes(String playerName) throws IllegalArgumentException
	{
		if (!players.containsKey(playerName))
			throw new IllegalArgumentException("Player does not exists!");

		return players.get(playerName);
	}

	public String getPlayerName(int id)
	{
		return playersId.get(id);
	}

	/**
	 * @return imie zwyciescy
	 */
	public String getWinnerName()
	{
		int max = 0;
		String winnerName = null;

		for (Map.Entry<String, Integer> player : players.entrySet())
		{
			if (player.getValue() > max)
			{
				max = player.getValue();
				winnerName = player.getKey();
			}
		}

		if (max == 0) //remis
		{
			return null;
		}

		return winnerName;
	}
	
	/**
	 * Metoda sprawdza, czy któryś z graczy ma zero żyć
	 * @return true jeśli któryś z graczy ma zero żyć
	 */
	public boolean isEndOfGame()
	{
		for (Map.Entry<String, Integer> player : players.entrySet())
		{
			if (player.getValue() == 0)
			{
				return true;
			}
		}

		return false;
	}
	
	/**
	 * resetuje obiekt
	 */
	public void reset()
	{
		players.clear();
		playersId.clear();
	}
}
